#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef struct {int v,nxt;} edge;

const int MAXN = 1e5+10;
const ll  inf = 1e18;

ll f[MAXN][2],g[MAXN][2],dp[MAXN][20][2][2];
int fa[MAXN][20],m,n,w[MAXN],dep[MAXN],h[MAXN],cnt;
edge e[MAXN<<1];

#define in read()

int read(){
	int x = 0,sgn = 1;char ch = getchar();
	for(;!isdigit(ch);ch = getchar()) if(ch == '-') sgn = -1;
	for(;isdigit(ch);ch = getchar()) x = (x<<1) + (x<<3) + (ch^48);
	return x*sgn;
}

void link(int x,int y){e[++cnt] = (edge){y,h[x]};h[x] = cnt;}

void dfs1(int x,int p){
	for(int i = h[x];i;i = e[i].nxt){
		int y = e[i].v; if(y == p) continue;
		dfs1(y,x);
		f[x][0] += f[y][1];
		f[x][1] += min(f[y][0],f[y][1]);
	}
	f[x][1] += w[x];
}

void dfs2(int x,int p){
	fa[x][0] = p; dep[x] = dep[p]+1;
	dp[x][0][0][0] = inf;
	dp[x][0][0][1] = dp[x][0][1][1] = f[p][1] - min(f[x][0],f[x][1]);
	dp[x][0][1][0] = f[p][0] - f[x][1];
	for(int i = 1;i < 20;i++){
		int mid = fa[x][i-1];
		fa[x][i] = fa[mid][i-1];
		for(int a = 0;a < 2;a++)
			for(int b = 0;b < 2;b++){
				dp[x][i][a][b] = min(dp[x][i-1][a][0] + dp[mid][i-1][0][b],dp[x][i-1][a][1] + dp[mid][i-1][1][b]);
			}
	}
	for(int i = h[x];i;i = e[i].nxt){
		int y = e[i].v; if(y == p) continue;
		g[y][0] = g[x][1] + f[x][1] - min(f[y][0],f[y][1]);
		g[y][1] = min(g[y][0],g[x][0] + f[x][0] - f[y][1]);
		dfs2(y,x);
	}
}

bool check(int a,int x,int b,int y){
	if((fa[b][0] == a || fa[a][0] == b)&& x == 0 && y == 0) return 1;
	return 0;
}

ll getans(int a,int x,int b,int y){
	if(dep[a] < dep[b]) swap(a,b),swap(x,y);
	ll ansa[2],ansb[2],nowa[2],nowb[2];
	ansa[x] = f[a][x],ansb[y] = f[b][y];
	ansa[x^1] = ansb[y^1] = inf;
	for(int i = 19;~i;i--){
		if(dep[fa[a][i]] >= dep[b]){
			nowa[0] = nowa[1] = inf;
			for(int x1 = 0;x1 < 2;x1++)
				for(int x2 = 0;x2 < 2;x2++)
					nowa[x2] = min(nowa[x2],ansa[x1] + dp[a][i][x1][x2]);
			ansa[0] = nowa[0],ansa[1] = nowa[1];
			a = fa[a][i];
		}
	}
	if(a == b) return ansa[y] + g[a][y];
	for(int i = 19;~i;i--){
		if(fa[a][i] != fa[b][i]){
			nowa[0] = nowa[1] = inf;
			for(int x1 = 0;x1 < 2;x1++)
				for(int x2 = 0;x2 < 2;x2++)
					nowa[x2] = min(nowa[x2],ansa[x1] + dp[a][i][x1][x2]);
			ansa[0] = nowa[0],ansa[1] = nowa[1];
			a = fa[a][i];
			nowb[0] = nowb[1] = inf;
			for(int x1 = 0;x1 < 2;x1++)
				for(int x2 = 0;x2 < 2;x2++)
					nowb[x2] = min(nowb[x2],ansb[x1] + dp[b][i][x1][x2]);
			ansb[0] = nowb[0],ansb[1] = nowb[1];
			b = fa[b][i];
		}
	}
	int lca = fa[a][0];
	ll ans0 = g[lca][0] + ansa[1] + ansb[1] + f[lca][0] - f[a][1] - f[b][1];
	ll ans1 = g[lca][1] - min(f[a][1],f[a][0]) - min(f[b][1],f[b][0]) + f[lca][1] + min(ansa[0],ansa[1]) + min(ansb[0],ansb[1]);
	return min(ans0,ans1);
}

int main (){
	freopen("defense.in","r",stdin);
	freopen("defense.out","w",stdout);
	n = in,m = in;in;
	for(int i = 1;i <= n;i++) w[i] = in;
	for(int i = 1;i < n;i++){
		int x = in,y = in;
		link(x,y);link(y,x);
	}
	dfs1(1,0); dfs2(1,0);
	while(m--){
		int a = in,x = in,b = in,y = in;
		if(check(a,x,b,y)) puts("-1");
		else{
			ll ans = getans(a,x,b,y);
			printf("%lld\n",ans);
		}
	}
	return 0;
}
